package com.elecbook.content.api.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;

/**
 * @author zken
 * @description 资源服务配置类
 * @CreateDate 2024/10/16 15:54:14
 */
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) // 启用安全方法
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    // 资源服务的标识
    public static final String RESOURCE_ID = "elecbookId";

    @Autowired
    TokenStore tokenStore;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID)
                .tokenStore(tokenStore)
                .stateless(true); // 设置无状态（因为jwt)
    }


    /**
     * description 此资源服务器，要求所有方法都需要进行认证，但是如果网关进行了放行会如何呢？
     * 首先，如果网关不对这个content这个资源地址做限制，那么，若是资源地址不作限制，那么就可随意访问
     * 如果网关无限制，资源地址有限制，那么资源地址仍然会检测内容
     * 如果网关有限制，资源地址无限制，会被网关进行拦截，
     * 所以，归根结底，资源地址和授权地址是完全分离的，网关只不过是多了一层校验而已，反正也可以直接访问资源地址的真实地址（绕过网关）
     *
     * @author zken
     * CreateDate 2024/11/2 01:12:46
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                //TODO 删除调试参数
                // 设置此参数来进行调试
                .antMatchers("/doc.html/**").permitAll()
                .antMatchers("/webjars/**").permitAll()
                .antMatchers("/swagger-resources/**").permitAll()
                .antMatchers("/v2/**").permitAll()
                .antMatchers("/**").authenticated()
                .anyRequest().permitAll()

        ;
    }
}
